1 Introduction

The COVID-19 pandemic, caused by the novel coronavirus SARS-CoV-2, has had an unprecedented impact on global health, economies, and daily life since its emergence in late 2019. As the world fights with the challenges posed by this highly contagious virus, epidemiological data have been continuously gathered and released to the public, driving numerous researches and different approaches in trying to understand its patterns of transmission, to identify vulnerable populations, and to inform public health strategies. Due to the severity of the early stage of the pandemic and its wide impact on global production, data of high quality and accuracy were gathered in the nation through surveys and reports, so we believed that the COVID-19 data sets could be more informative and extensive than other epidemiology data.

In this assignment, we looked into the COVID-19 epidemiology data sets provided by Statistics Canada along with other related data sets. We attempted to answer three major questions in three subsections:

  1. We wanted to find if there was a possible relationship between the COVID pandemic and the excess mortality for 2020, 2021 and 2022. Through this question, one might be able to draw insights on whether the virus has had a dangerous impact on the overall public health.

  2. We gathered data of COVID-19 long term symptom among Canadian adults. We wanted to draw some conclusions on whether the virus had any impact on the long-term health condition of Canadians.

  3. We wanted to measure the relationship between the risk prevalence and some factors like vaccination status, chronic conditions and having or not a direct contact with people etc. By building a statistical model between the response and predictors, it helped us understand what procedures or conditions can affect the prevalence of COVID-19.

2 Method

2.1 Section 1: Mortality

2.2 Section 2: Long-term Impact

The data of COVID-19 long term symptom among Canadian adults contain the major variables shown in the following table. We mainly interested in the Measures which is the response variable. The data is grouped by sex and age groups. The value shows the percentage of responses within each specific group.The original data provided the confidence intervals in the assessment of point estimates in case of high variability in the data.

Table (): Long Term Symptoms Data Definition
Variables Type Example Number.Unique PctMissing Comment
REF_DATE integer 2022 1 0% Reference Year (2022)
GEO character Canada 1 0% Geographic Location (Canada)
Measures character Yes, had long-term symptoms, No, did not have long-term symptoms 2 0% Does the respondent have the long term symptoms? Yes or No.
Sex character Both sexes, Males 3 0% Sex Category
Age.group character Ages 18 and over, Ages 18 to 34 5 0% Age Groups
Characteristics character Percent, Low 95% confidence interval, percent 3 0% Characteristics of the value, estimate or confidence interval
UOM character Percent 1 0% Unit of Measure (Percentage of the group)
VALUE numeric 16, 14.9 86 0% Data Value
DECIMALS integer 1 1 0% Number of Decimal Places in Value

As the data of COVID-19 long term symptom among Canadian adults did not contain the population size and population for each groups. We estimate the counts from the data of Weekly number of COVID-19 cases in Canada as of October 28, 2023. From the data of overall COVID-19 cases, we first grouped the data to the similar structure as our Long Term Symptom data. The data of other genders was dropped because that the count is too small comparing to the total population.

The data is first grouped by sex which consists of “males”, “females”, and “Both sexes”. “Both sexes” group contain the combined data from both males and females. Then the data is further grouped by age groups. Subgroup “Ages 18 and over” has the total count for the corresponding sex group. The data is shown in the Table()

Table ():Combined Data Showing Proportions and Counts by Sex and Age
Sex Age Group No, did not have long-term symptoms (Percent) Yes, had long-term symptoms (Percent) Count
Both sexes Ages 18 and over 84.0 16.0 3959044
Both sexes Ages 18 to 34 84.6 15.4 1506093
Both sexes Ages 35 to 49 84.3 15.7 657497
Both sexes Ages 50 to 64 83.3 16.7 1012269
Both sexes Ages 65 and over 82.2 17.8 783185
Females Ages 18 and over 79.9 20.1 2187574
Females Ages 18 to 34 82.1 17.9 851700
Females Ages 35 to 49 80.3 19.7 376243
Females Ages 50 to 64 77.8 22.2 534045
Females Ages 65 and over 75.6 24.4 425586
Males Ages 18 and over 88.0 12.0 1771470
Males Ages 18 to 34 87.0 13.0 654393
Males Ages 35 to 49 88.3 11.7 281254
Males Ages 50 to 64 88.9 11.1 478224
Males Ages 65 and over 89.2 10.8 357599

From the Table(), we find that for females, higher proportion(24.4%) of respondents from age 65 and over reported long term symptoms. While males from ages 18 to 34 show a higher proportion(13%) to report long term symptoms. Overall(both sexes), higher proportion(17.8%) of adults from ages 65 and over reported long term symptoms. For all age groups, 20.1% of females reported long term symptoms comparing to only 12% of males.

To study the association between age groups and the long term symptoms, A Chi-square test was conducted within each sex group. The hypothesis of independence corresponds to \(H_0:p_{ij}=p_{i\cdot}p_{\cdot j}, \forall i,j\). Here under each sex group, we have row variable as the age groups, column variable as the response of long term symptoms. Counts for specific responses “Yes, had long-term symptoms” and “No, did not have long-term symptoms” are estimated using the corresponding proportion and the total counts of each subgroup. Test results are shown in the following table.

Table():Chi-Squared Test Results of Age groups and Long term symptoms
Sex Chi-Squared Statistic P-Value
Males 1,470.647 < 0.05
Females 8,591.190 < 0.05
Both sexes 2,477.902 < 0.05
Table():Chi-Squared Test Results of Sex and Long term symptoms
Age Group Chi-Squared Statistic P-Value
Ages 18 to 34 6,688.391 < 0.05
Ages 35 to 49 7,557.558 < 0.05
Ages 50 to 64 22,075.524 < 0.05
Ages 65 and over 24,151.052 < 0.05

prop test? fisher test? G-test?

2.3 Section 3: Prevalence Modeling

3 Result

3.1 Section 1: Mortality

3.2 Section 2: Long-term Impact

3.3 Section 3: Prevalence Modeling

4 Discussion

4.1 Section 1: Mortality

4.2 Section 2: Long-term Impact

4.3 Section 3: Prevalence Modeling

5 Conclusion

6 References

LS0tDQp0aXRsZTogIk1BVDUzMTcgQ2F0ZWdvcmljYWwgQXNzaWdubWVudCAyIg0KYXV0aG9yOg0KLSBUZW5nIExpKDczNzMwODYpDQotIFpoaXplIEx1KDMwMDA3NTExNCkNCi0gQ2h1dG9uZyBaaGFuZygzMDAzMTEzMjUpDQpvdXRwdXQ6IA0KICBodG1sX25vdGVib29rOiANCiAgICB0b2M6IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgZmlnX2NhcHRpb246IHllcw0KaGVhZGVyLWluY2x1ZGVzOg0KLSBccmVuZXdjb21tYW5ke1xhbmR9e1xcfQ0KLSBcdXNlcGFja2FnZXtmbG9hdH0NCi0gXGZsb2F0cGxhY2VtZW50e2ZpZ3VyZX17SH0NCmJpYmxpb2dyYXBoeTogUmVmZXJlbmNlcy5iaWINCmxpbmstY2l0YXRpb25zOiB5ZXMNCi0tLQ0KDQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KLnRpdGxlLCAuYXV0aG9ye3RleHQtYWxpZ246IGNlbnRlcjt9DQpib2R5e2ZvbnQtc2l6ZTogMTJwdDt9DQp0YWJsZXtmb250LXNpemU6IDEycHQ7fQ0KaDF7Zm9udC1zaXplOiAxNHB0O30NCmgye2ZvbnQtc2l6ZTogMTJwdDt9DQo8L3N0eWxlPg0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHBsb3RseSkNCmxpYnJhcnkoYmVzdGdsbSkNCmxpYnJhcnkoZ3QpDQpsaWJyYXJ5KHN0YXJnYXplcikNCmBgYA0KDQpgYGB7cn0NCkNDQUhTPC1yZWFkLmNzdigiQ0NBSFMuY3N2IiwgaGVhZGVyID0gVFJVRSkNCkNvdmlkPC1yZWFkLmNzdigiQ292aWQuY3N2IiwgaGVhZGVyID0gVFJVRSkNCkNvdmlkX2FHPC1yZWFkLmNzdigiQ09WSURfY2FzZXMuY3N2IiwgaGVhZGVyID0gVFJVRSkNCldNb3J0YWxpdHk8LXJlYWQuY3N2KCJXZWVrbHlNb3J0YWxpdHkuY3N2IiwgaGVhZGVyID0gVFJVRSkNCkV4TW9ydGFsaXR5PC1yZWFkLmNzdigiRXhjZXNzTW9ydGFsaXR5LmNzdiIsIGhlYWRlciA9IFRSVUUpDQpMb25nVGVybTwtcmVhZC5jc3YoIkxvbmdUZXJtLmNzdiIsIGhlYWRlciA9IFRSVUUpDQpgYGANCg0KIyBJbnRyb2R1Y3Rpb24NCg0KVGhlIENPVklELTE5IHBhbmRlbWljLCBjYXVzZWQgYnkgdGhlIG5vdmVsIGNvcm9uYXZpcnVzIFNBUlMtQ29WLTIsIGhhcyBoYWQgYW4gdW5wcmVjZWRlbnRlZCBpbXBhY3Qgb24gZ2xvYmFsIGhlYWx0aCwgZWNvbm9taWVzLCBhbmQgZGFpbHkgbGlmZSBzaW5jZSBpdHMgZW1lcmdlbmNlIGluIGxhdGUgMjAxOS4gQXMgdGhlIHdvcmxkIGZpZ2h0cyB3aXRoIHRoZSBjaGFsbGVuZ2VzIHBvc2VkIGJ5IHRoaXMgaGlnaGx5IGNvbnRhZ2lvdXMgdmlydXMsIGVwaWRlbWlvbG9naWNhbCBkYXRhIGhhdmUgYmVlbiBjb250aW51b3VzbHkgZ2F0aGVyZWQgYW5kIHJlbGVhc2VkIHRvIHRoZSBwdWJsaWMsIGRyaXZpbmcgbnVtZXJvdXMgcmVzZWFyY2hlcyBhbmQgZGlmZmVyZW50IGFwcHJvYWNoZXMgaW4gdHJ5aW5nIHRvIHVuZGVyc3RhbmQgaXRzIHBhdHRlcm5zIG9mIHRyYW5zbWlzc2lvbiwgdG8gaWRlbnRpZnkgdnVsbmVyYWJsZSBwb3B1bGF0aW9ucywgYW5kIHRvIGluZm9ybSBwdWJsaWMgaGVhbHRoIHN0cmF0ZWdpZXMuIER1ZSB0byB0aGUgc2V2ZXJpdHkgb2YgdGhlIGVhcmx5IHN0YWdlIG9mIHRoZSBwYW5kZW1pYyBhbmQgaXRzIHdpZGUgaW1wYWN0IG9uIGdsb2JhbCBwcm9kdWN0aW9uLCBkYXRhIG9mIGhpZ2ggcXVhbGl0eSBhbmQgYWNjdXJhY3kgd2VyZSBnYXRoZXJlZCBpbiB0aGUgbmF0aW9uIHRocm91Z2ggc3VydmV5cyBhbmQgcmVwb3J0cywgc28gd2UgYmVsaWV2ZWQgdGhhdCB0aGUgQ09WSUQtMTkgZGF0YSBzZXRzIGNvdWxkIGJlIG1vcmUgaW5mb3JtYXRpdmUgYW5kIGV4dGVuc2l2ZSB0aGFuIG90aGVyIGVwaWRlbWlvbG9neSBkYXRhLg0KDQpJbiB0aGlzIGFzc2lnbm1lbnQsIHdlIGxvb2tlZCBpbnRvIHRoZSBDT1ZJRC0xOSBlcGlkZW1pb2xvZ3kgZGF0YSBzZXRzIHByb3ZpZGVkIGJ5IFN0YXRpc3RpY3MgQ2FuYWRhIGFsb25nIHdpdGggb3RoZXIgcmVsYXRlZCBkYXRhIHNldHMuIFdlIGF0dGVtcHRlZCB0byBhbnN3ZXIgdGhyZWUgbWFqb3IgcXVlc3Rpb25zIGluIHRocmVlIHN1YnNlY3Rpb25zOg0KDQoxLiBXZSB3YW50ZWQgdG8gZmluZCBpZiB0aGVyZSB3YXMgYSBwb3NzaWJsZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgQ09WSUQgcGFuZGVtaWMgYW5kIHRoZSBleGNlc3MgbW9ydGFsaXR5IGZvciAyMDIwLCAyMDIxIGFuZCAyMDIyLiBUaHJvdWdoIHRoaXMgcXVlc3Rpb24sIG9uZSBtaWdodCBiZSBhYmxlIHRvIGRyYXcgaW5zaWdodHMgb24gd2hldGhlciB0aGUgdmlydXMgaGFzIGhhZCBhIGRhbmdlcm91cyBpbXBhY3Qgb24gdGhlIG92ZXJhbGwgcHVibGljIGhlYWx0aC4NCg0KMi4gV2UgZ2F0aGVyZWQgZGF0YSBvZiBDT1ZJRC0xOSBsb25nIHRlcm0gc3ltcHRvbSBhbW9uZyBDYW5hZGlhbiBhZHVsdHMuIFdlIHdhbnRlZCB0byBkcmF3IHNvbWUgY29uY2x1c2lvbnMgb24gd2hldGhlciB0aGUgdmlydXMgaGFkIGFueSBpbXBhY3Qgb24gdGhlIGxvbmctdGVybSBoZWFsdGggY29uZGl0aW9uIG9mIENhbmFkaWFucy4NCg0KMy4gV2Ugd2FudGVkIHRvIG1lYXN1cmUgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSByaXNrIHByZXZhbGVuY2UgYW5kIHNvbWUgZmFjdG9ycyBsaWtlIHZhY2NpbmF0aW9uIHN0YXR1cywgY2hyb25pYyBjb25kaXRpb25zIGFuZCBoYXZpbmcgb3Igbm90IGEgZGlyZWN0IGNvbnRhY3Qgd2l0aCBwZW9wbGUgZXRjLiBCeSBidWlsZGluZyBhIHN0YXRpc3RpY2FsIG1vZGVsIGJldHdlZW4gdGhlIHJlc3BvbnNlIGFuZCBwcmVkaWN0b3JzLCBpdCBoZWxwZWQgdXMgdW5kZXJzdGFuZCB3aGF0IHByb2NlZHVyZXMgb3IgY29uZGl0aW9ucyBjYW4gYWZmZWN0IHRoZSBwcmV2YWxlbmNlIG9mIENPVklELTE5LiAgDQoNCiMgTWV0aG9kDQoNCiMjIFNlY3Rpb24gMTogTW9ydGFsaXR5DQoNCiMjIFNlY3Rpb24gMjogTG9uZy10ZXJtIEltcGFjdA0KDQpUaGUgZGF0YSBvZiBDT1ZJRC0xOSBsb25nIHRlcm0gc3ltcHRvbSBhbW9uZyBDYW5hZGlhbiBhZHVsdHMgY29udGFpbiB0aGUgbWFqb3IgdmFyaWFibGVzIHNob3duIGluIHRoZSBmb2xsb3dpbmcgdGFibGUuIFdlIG1haW5seSBpbnRlcmVzdGVkIGluIHRoZSBNZWFzdXJlcyB3aGljaCBpcyB0aGUgcmVzcG9uc2UgdmFyaWFibGUuIFRoZSBkYXRhIGlzIGdyb3VwZWQgYnkgc2V4IGFuZCBhZ2UgZ3JvdXBzLiBUaGUgdmFsdWUgc2hvd3MgdGhlIHBlcmNlbnRhZ2Ugb2YgcmVzcG9uc2VzIHdpdGhpbiBlYWNoIHNwZWNpZmljIGdyb3VwLlRoZSBvcmlnaW5hbCBkYXRhIHByb3ZpZGVkIHRoZSBjb25maWRlbmNlIGludGVydmFscyBpbiB0aGUgYXNzZXNzbWVudCBvZiBwb2ludCBlc3RpbWF0ZXMgaW4gY2FzZSBvZiBoaWdoIHZhcmlhYmlsaXR5IGluIHRoZSBkYXRhLiANCg0KYGBge3J9DQpEYXRhRGljdF9kYXRhIDwtIExvbmdUZXJtWyxjKDEsMiw0LDUsNiw3LDgsMTQsMTgpXQ0KDQpEYXRhRGljdDwtZGF0YS5mcmFtZSgNCiAgVmFyaWFibGVzPWNvbG5hbWVzKERhdGFEaWN0X2RhdGEpLCAgIA0KICBUeXBlPXNhcHBseShEYXRhRGljdF9kYXRhLCBmdW5jdGlvbih4KSBjbGFzcyh4KSksDQogIEV4YW1wbGU9c2FwcGx5KERhdGFEaWN0X2RhdGEsIGZ1bmN0aW9uKHgpIHBhc3RlKGFzLmNoYXJhY3RlcihoZWFkKHVuaXF1ZSh4KSwyKSksIGNvbGxhcHNlID0gIiwgIikpLA0KICBOdW1iZXIuVW5pcXVlPXNhcHBseShEYXRhRGljdF9kYXRhLCBmdW5jdGlvbih4KSBsZW5ndGgodW5pcXVlKHgpKSksDQogIFBjdE1pc3Npbmc9c2FwcGx5KERhdGFEaWN0X2RhdGEsIGZ1bmN0aW9uKHgpIHBhc3RlMChyb3VuZChzdW0oaXMubmEoeCkpL2xlbmd0aCh4KSwgNCkqMTAwLCIlIikpLA0KICBDb21tZW50PWMoIlJlZmVyZW5jZSBZZWFyICgyMDIyKSIsDQogICAgICAgICAgICAgICAgICAiR2VvZ3JhcGhpYyBMb2NhdGlvbiAoQ2FuYWRhKSIsDQogICAgICAgICAgICAgICAgICAiRG9lcyB0aGUgcmVzcG9uZGVudCBoYXZlIHRoZSBsb25nIHRlcm0gc3ltcHRvbXM/IFllcyBvciBOby4iLA0KICAgICAgICAgICAgICAgICAgIlNleCBDYXRlZ29yeSIsDQogICAgICAgICAgICAgICAgICAiQWdlIEdyb3VwcyIsDQogICAgICAgICAgICAgICAgICAiQ2hhcmFjdGVyaXN0aWNzIG9mIHRoZSB2YWx1ZSwgZXN0aW1hdGUgb3IgY29uZmlkZW5jZSBpbnRlcnZhbCIsDQogICAgICAgICAgICAgICAgICAiVW5pdCBvZiBNZWFzdXJlIChQZXJjZW50YWdlIG9mIHRoZSBncm91cCkiLA0KICAgICAgICAgICAgICAgICAgIkRhdGEgVmFsdWUiLA0KICAgICAgICAgICAgICAgICAgIk51bWJlciBvZiBEZWNpbWFsIFBsYWNlcyBpbiBWYWx1ZSIpDQopDQpEYXRhRGljdCU+JWd0KCklPiV0YWJfaGVhZGVyKA0KICAgIHRpdGxlID0gIlRhYmxlICgpOiBMb25nIFRlcm0gU3ltcHRvbXMgRGF0YSBEZWZpbml0aW9uIikNCmBgYA0KDQpBcyB0aGUgZGF0YSBvZiBDT1ZJRC0xOSBsb25nIHRlcm0gc3ltcHRvbSBhbW9uZyBDYW5hZGlhbiBhZHVsdHMgZGlkIG5vdCBjb250YWluIHRoZSBwb3B1bGF0aW9uIHNpemUgYW5kIHBvcHVsYXRpb24gZm9yIGVhY2ggZ3JvdXBzLiBXZSBlc3RpbWF0ZSB0aGUgY291bnRzIGZyb20gdGhlIGRhdGEgb2YgV2Vla2x5IG51bWJlciBvZiBDT1ZJRC0xOSBjYXNlcyBpbiBDYW5hZGEgYXMgb2YgT2N0b2JlciAyOCwgMjAyMy4gRnJvbSB0aGUgZGF0YSBvZiBvdmVyYWxsIENPVklELTE5IGNhc2VzLCB3ZSBmaXJzdCBncm91cGVkIHRoZSBkYXRhIHRvIHRoZSBzaW1pbGFyIHN0cnVjdHVyZSBhcyBvdXIgTG9uZyBUZXJtIFN5bXB0b20gZGF0YS4gVGhlIGRhdGEgb2Ygb3RoZXIgZ2VuZGVycyB3YXMgZHJvcHBlZCBiZWNhdXNlIHRoYXQgdGhlIGNvdW50IGlzIHRvbyBzbWFsbCBjb21wYXJpbmcgdG8gdGhlIHRvdGFsIHBvcHVsYXRpb24uDQpgYGB7cn0NCiNncm91cCB0aGUgbG9uZ3Rlcm0gZGF0YSBhbmQgZHJvcCB2YXJpYWJsZXMgbm90IHVzZWQgaW4gdGhlIGFuYWx5c2lzDQpncm91cGVkX2RhdGEgPC0gTG9uZ1Rlcm0gJT4lDQogIGZpbHRlcihDaGFyYWN0ZXJpc3RpY3MgPT0gJ1BlcmNlbnQnKSAlPiUNCiAgZ3JvdXBfYnkoU2V4LCBBZ2UuZ3JvdXAsIE1lYXN1cmVzKSAlPiUNCiAgc3VtbWFyaXNlKFZBTFVFLCAuZ3JvdXBzID0gJ2Ryb3AnKSAlPiUgDQogIHNwcmVhZChNZWFzdXJlcywgVkFMVUUpDQoNCiNjbGVhbiB0aGUgY292aWQgY2FzZXMgZGF0YSBieSBhZ2UgYW5kIGdlbmRlcg0KY2xlYW5lZF9kYXRhIDwtIENvdmlkX2FHICU+JQ0KICBzZWxlY3QoLXJhdGVfcGVyXzEwMDAwMCkgJT4lDQogIGZpbHRlcihzdGF0dXMgIT0gJ2RlYXRocycsIA0KICAgICAgICAgYWdlX2dyb3VwICE9ICdhbGwnLCANCiAgICAgICAgIGdlbmRlciAhPSAnYWxsJywNCiAgICAgICAgIGdlbmRlciAhPSAnb3RoZXInKSAlPiUNCiAgbmEub21pdCgpDQoNCiNtYXRjaCB0aGUgYWdlIGdyb3VwcyBjYXRlZ29yaWVzIHdpdGggbG9uZ3Rlcm0NCm1hcF9hZ2VfZ3JvdXAgPC0gZnVuY3Rpb24oYWdlX2dyb3VwKSB7DQogIGNhc2Vfd2hlbigNCiAgICBhZ2VfZ3JvdXAgJWluJSBjKCIyMCB0byAyOSIsICIzMCB0byAzOSIpIH4gIkFnZXMgMTggdG8gMzQiLA0KICAgIGFnZV9ncm91cCAlaW4lIGMoIjQwIHRvIDQ5IikgfiAiQWdlcyAzNSB0byA0OSIsDQogICAgYWdlX2dyb3VwICVpbiUgYygiNTAgdG8gNTkiLCAiNjAgdG8gNjkiKSB+ICJBZ2VzIDUwIHRvIDY0IiwNCiAgICBhZ2VfZ3JvdXAgJWluJSBjKCI3MCB0byA3OSIsICI4MCsiKSB+ICJBZ2VzIDY1IGFuZCBvdmVyIiwNCiAgICBUUlVFIH4gTkFfY2hhcmFjdGVyXyANCiAgKQ0KfQ0KDQojbWF0Y2ggdGhlIHNleCBjYXRlZ29yaWVzDQpzdW1tYXJ5X2RhdGEgPC0gY2xlYW5lZF9kYXRhICU+JQ0KICBtdXRhdGUoYWdlX2dyb3VwID0gbWFwX2FnZV9ncm91cChhZ2VfZ3JvdXApKSAlPiUNCiAgbXV0YXRlKGdlbmRlciA9IGNhc2Vfd2hlbigNCiAgICBnZW5kZXIgPT0gJ21hbGUnIH4gJ01hbGVzJywNCiAgICBnZW5kZXIgPT0gJ2ZlbWFsZScgfiAnRmVtYWxlcycsDQogICAgVFJVRSB+IGdlbmRlcg0KICApKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShhZ2VfZ3JvdXApKSAlPiUNCiAgZ3JvdXBfYnkoZ2VuZGVyLGFnZV9ncm91cCkgJT4lDQogIHN1bW1hcmlzZShjb3VudCA9IHN1bShjb3VudCksIC5ncm91cHMgPSAnZHJvcCcpDQoNCiN0b3RhbCBmb3IgYWdlcw0KYWdlc18xOF9hbmRfb3ZlciA8LSBzdW1tYXJ5X2RhdGEgJT4lDQogIGdyb3VwX2J5KGdlbmRlcikgJT4lDQogIHN1bW1hcmlzZShjb3VudCA9IHN1bShjb3VudCksIC5ncm91cHMgPSAnZHJvcCcpICU+JQ0KICBtdXRhdGUoYWdlX2dyb3VwID0gJ0FnZXMgMTggYW5kIG92ZXInKQ0KDQpzdW1tYXJ5X2RhdGEgPC0gYmluZF9yb3dzKHN1bW1hcnlfZGF0YSwgYWdlc18xOF9hbmRfb3ZlcikNCg0KI2JvdGggc2V4ZXMNCmJvdGhfc2V4ZXNfZGF0YSA8LSBzdW1tYXJ5X2RhdGEgJT4lDQogIGZpbHRlcihnZW5kZXIgJWluJSBjKCdNYWxlcycsICdGZW1hbGVzJykpICU+JQ0KICBncm91cF9ieShhZ2VfZ3JvdXApICU+JQ0KICBzdW1tYXJpc2UoY291bnQgPSBzdW0oY291bnQpLCAuZ3JvdXBzID0gJ2Ryb3AnKSAlPiUNCiAgbXV0YXRlKGdlbmRlciA9ICdCb3RoIHNleGVzJykNCg0KZmluYWxfc3VtbWFyeV9kYXRhIDwtIHJiaW5kKHN1bW1hcnlfZGF0YSwgYm90aF9zZXhlc19kYXRhKQ0KZmluYWxfc3VtbWFyeV9kYXRhIDwtIGZpbmFsX3N1bW1hcnlfZGF0YSAlPiUNCiAgYXJyYW5nZShnZW5kZXIsIGFnZV9ncm91cCkgJT4lDQogIHJlbmFtZShTZXggPSBnZW5kZXIsIEFnZS5ncm91cCA9IGFnZV9ncm91cCkNCg0KI2NvbWJpbmUgbG9uZ3Rlcm0gcHJvcG9ydGlvbiBkYXRhIHdpdGggdGhlIGdyb3VwIGNvdW50cw0KY29tYmluZWRfZGF0YSA8LSBsZWZ0X2pvaW4oZ3JvdXBlZF9kYXRhLCBmaW5hbF9zdW1tYXJ5X2RhdGEsIGJ5ID0gYygiU2V4IiwgIkFnZS5ncm91cCIpKQ0KYGBgDQoNClRoZSBkYXRhIGlzIGZpcnN0IGdyb3VwZWQgYnkgc2V4IHdoaWNoIGNvbnNpc3RzIG9mICJtYWxlcyIsICJmZW1hbGVzIiwgYW5kICJCb3RoIHNleGVzIi4gIkJvdGggc2V4ZXMiIGdyb3VwIGNvbnRhaW4gdGhlIGNvbWJpbmVkIGRhdGEgZnJvbSBib3RoIG1hbGVzIGFuZCBmZW1hbGVzLiBUaGVuIHRoZSBkYXRhIGlzIGZ1cnRoZXIgZ3JvdXBlZCBieSBhZ2UgZ3JvdXBzLiBTdWJncm91cCAiQWdlcyAxOCBhbmQgb3ZlciIgaGFzIHRoZSB0b3RhbCBjb3VudCBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgc2V4IGdyb3VwLiBUaGUgZGF0YSBpcyBzaG93biBpbiB0aGUgVGFibGUoKQ0KYGBge3J9DQpndF90YWJsZSA8LSBjb21iaW5lZF9kYXRhICU+JQ0KICBndCgpICU+JQ0KICB0YWJfaGVhZGVyKA0KICAgIHRpdGxlID0gbWQoIioqVGFibGUgKCk6Q29tYmluZWQgRGF0YSBTaG93aW5nIFByb3BvcnRpb25zIGFuZCBDb3VudHMgYnkgU2V4IGFuZCBBZ2UqKiIpDQogICkgJT4lDQogIGNvbHNfbGFiZWwoDQogICAgU2V4ID0gIlNleCIsDQogICAgYEFnZS5ncm91cGAgPSAiQWdlIEdyb3VwIiwNCiAgICBgWWVzLCBoYWQgbG9uZy10ZXJtIHN5bXB0b21zYCA9ICJZZXMsIGhhZCBsb25nLXRlcm0gc3ltcHRvbXMgKFBlcmNlbnQpIiwNCiAgICBgTm8sIGRpZCBub3QgaGF2ZSBsb25nLXRlcm0gc3ltcHRvbXNgID0gIk5vLCBkaWQgbm90IGhhdmUgbG9uZy10ZXJtIHN5bXB0b21zIChQZXJjZW50KSIsDQogICAgY291bnQgPSAiQ291bnQiDQogICkgJT4lDQogIHRhYl9zdHlsZSgNCiAgICBzdHlsZSA9IGxpc3QoDQogICAgICBjZWxsX2JvcmRlcnMoc2lkZXMgPSAiYm90dG9tIiwgd2VpZ2h0ID0gcHgoMikpDQogICAgKSwNCiAgICBsb2NhdGlvbnMgPSBjZWxsc19ib2R5KA0KICAgICAgcm93cyA9IGNvbWJpbmVkX2RhdGEkU2V4ICE9IGRwbHlyOjpsZWFkKGNvbWJpbmVkX2RhdGEkU2V4KQ0KICAgICkNCiAgKSAlPiUNCiAgdGFiX3N0eWxlKA0KICAgIHN0eWxlID0gbGlzdCgNCiAgICAgIGNlbGxfZmlsbChjb2xvciA9ICJsaWdodGdyZXkiKSwgDQogICAgICBjZWxsX3RleHQod2VpZ2h0ID0gImJvbGQiKQ0KICAgICksDQogICAgbG9jYXRpb25zID0gY2VsbHNfY29sdW1uX2xhYmVscyhjb2x1bW5zID0gVFJVRSkNCiAgKSAlPiUNCiAgdGFiX3N0eWxlKA0KICAgIHN0eWxlID0gY2VsbF90ZXh0KGFsaWduID0gImNlbnRlciIpLCANCiAgICBsb2NhdGlvbnMgPSBjZWxsc19ib2R5KGNvbHVtbnMgPSBjKDMsNCkpDQogICkNCg0KaW52aXNpYmxlKHByaW50KGd0X3RhYmxlKSkNCmBgYA0KRnJvbSB0aGUgVGFibGUoKSwgd2UgZmluZCB0aGF0IGZvciBmZW1hbGVzLCBoaWdoZXIgcHJvcG9ydGlvbigyNC40JSkgb2YgcmVzcG9uZGVudHMgZnJvbSBhZ2UgNjUgYW5kIG92ZXIgcmVwb3J0ZWQgbG9uZyB0ZXJtIHN5bXB0b21zLiBXaGlsZSBtYWxlcyBmcm9tIGFnZXMgMTggdG8gMzQgc2hvdyBhIGhpZ2hlciBwcm9wb3J0aW9uKDEzJSkgdG8gcmVwb3J0IGxvbmcgdGVybSBzeW1wdG9tcy4gT3ZlcmFsbChib3RoIHNleGVzKSwgaGlnaGVyIHByb3BvcnRpb24oMTcuOCUpIG9mIGFkdWx0cyBmcm9tIGFnZXMgNjUgYW5kIG92ZXIgcmVwb3J0ZWQgbG9uZyB0ZXJtIHN5bXB0b21zLiBGb3IgYWxsIGFnZSBncm91cHMsIDIwLjElIG9mIGZlbWFsZXMgcmVwb3J0ZWQgbG9uZyB0ZXJtIHN5bXB0b21zIGNvbXBhcmluZyB0byBvbmx5IDEyJSBvZiBtYWxlcy4NCg0KVG8gc3R1ZHkgdGhlIGFzc29jaWF0aW9uIGJldHdlZW4gYWdlIGdyb3VwcyBhbmQgdGhlIGxvbmcgdGVybSBzeW1wdG9tcywgQSBDaGktc3F1YXJlIHRlc3Qgd2FzIGNvbmR1Y3RlZCB3aXRoaW4gZWFjaCBzZXggZ3JvdXAuIFRoZSBoeXBvdGhlc2lzIG9mIGluZGVwZW5kZW5jZSBjb3JyZXNwb25kcyB0byAkSF8wOnBfe2lqfT1wX3tpXGNkb3R9cF97XGNkb3Qgan0sIFxmb3JhbGwgaSxqJC4gSGVyZSB1bmRlciBlYWNoIHNleCBncm91cCwgd2UgaGF2ZSByb3cgdmFyaWFibGUgYXMgdGhlIGFnZSBncm91cHMsICBjb2x1bW4gdmFyaWFibGUgYXMgdGhlIHJlc3BvbnNlIG9mIGxvbmcgdGVybSBzeW1wdG9tcy4gQ291bnRzIGZvciBzcGVjaWZpYyByZXNwb25zZXMgIlllcywgaGFkIGxvbmctdGVybSBzeW1wdG9tcyIgYW5kICJObywgZGlkIG5vdCBoYXZlIGxvbmctdGVybSBzeW1wdG9tcyIgYXJlIGVzdGltYXRlZCB1c2luZyB0aGUgY29ycmVzcG9uZGluZyBwcm9wb3J0aW9uIGFuZCB0aGUgdG90YWwgY291bnRzIG9mIGVhY2ggc3ViZ3JvdXAuIFRlc3QgcmVzdWx0cyBhcmUgc2hvd24gaW4gdGhlIGZvbGxvd2luZyB0YWJsZS4NCmBgYHtyfQ0KbGlicmFyeShicm9vbSkNCnBlcmZvcm1fY2hpX3NxdWFyZTEgPC0gZnVuY3Rpb24oZGF0YSkgew0KICBmaWx0ZXJlZF9kYXRhIDwtIGZpbHRlcihkYXRhLCBgQWdlLmdyb3VwYCAhPSAiQWdlcyAxOCBhbmQgb3ZlciIpDQoNCiAgY29udGluZ2VuY3lfdGFibGUgPC0gZmlsdGVyZWRfZGF0YSAlPiUNCiAgICBzZWxlY3QoYEFnZS5ncm91cGAsIGBZZXMsIGhhZCBsb25nLXRlcm0gc3ltcHRvbXNgLCBjb3VudCkgJT4lDQogICAgbXV0YXRlKE5vID0gKDEwMCAtIGBZZXMsIGhhZCBsb25nLXRlcm0gc3ltcHRvbXNgKSAqIGNvdW50IC8gMTAwLA0KICAgICAgICAgICBZZXMgPSBgWWVzLCBoYWQgbG9uZy10ZXJtIHN5bXB0b21zYCAqIGNvdW50IC8gMTAwKSAlPiUNCiAgICBzZWxlY3QoLWBZZXMsIGhhZCBsb25nLXRlcm0gc3ltcHRvbXNgKSAlPiUNCiAgICBncm91cF9ieShgQWdlLmdyb3VwYCkNCg0KICBjaGlfc3F1YXJlX3Jlc3VsdCA8LSBjaGlzcS50ZXN0KGNvbnRpbmdlbmN5X3RhYmxlWy0xXSkNCiAgDQogIHJldHVybihjaGlfc3F1YXJlX3Jlc3VsdCkNCn0NCg0KcmVzdWx0czEgPC0gbGlzdCgpDQpzZXhlcyA8LSBjKCJNYWxlcyIsICJGZW1hbGVzIiwgIkJvdGggc2V4ZXMiKQ0KZm9yIChzZXggaW4gc2V4ZXMpIHsNCiAgZmlsdGVyZWRfZGF0YSA8LSBjb21iaW5lZF9kYXRhICU+JSBmaWx0ZXIoU2V4ID09IHNleCkNCiAgcmVzdWx0czFbW3NleF1dIDwtIHBlcmZvcm1fY2hpX3NxdWFyZTEoZmlsdGVyZWRfZGF0YSkNCn0NCg0KdGVzdF9yZXN1bHRzMSA8LSBsYXBwbHkocmVzdWx0czEsIHRpZHkpICU+JSBiaW5kX3Jvd3MoKSAlPiUgbXV0YXRlKFNleCA9IHNleGVzKQ0KdGVzdF9yZXN1bHRzMSA8LSBzZWxlY3QodGVzdF9yZXN1bHRzMSwgU2V4LCBzdGF0aXN0aWMsIHAudmFsdWUpDQoNCnNpZ25pZmljYW5jZV9sZXZlbCA8LSAwLjA1DQoNCnJlc3VsdF90YWJsZTEgPC0gdGVzdF9yZXN1bHRzMSAlPiUNCiAgZ3QoKSAlPiUNCiAgdGFiX2hlYWRlcigNCiAgICB0aXRsZSA9IG1kKCIqKlRhYmxlKCk6Q2hpLVNxdWFyZWQgVGVzdCBSZXN1bHRzIG9mIEFnZSBncm91cHMgYW5kIExvbmcgdGVybSBzeW1wdG9tcyoqIikNCiAgKSAlPiUNCiAgY29sc19sYWJlbCgNCiAgICBTZXggPSAiU2V4IiwNCiAgICBzdGF0aXN0aWMgPSAiQ2hpLVNxdWFyZWQgU3RhdGlzdGljIiwNCiAgICBwLnZhbHVlID0gIlAtVmFsdWUiDQogICkgJT4lDQogIGZtdF9udW1iZXIoDQogICAgY29sdW1ucyA9IHZhcnMoc3RhdGlzdGljLCBwLnZhbHVlKSwNCiAgICBkZWNpbWFscyA9IDMNCiAgKSAlPiUNCiAgZm10KA0KICAgIGNvbHVtbnMgPSB2YXJzKHAudmFsdWUpLA0KICAgIGZucyA9IGZ1bmN0aW9uKHgpIHsNCiAgICAgIGlmZWxzZSh4IDwgc2lnbmlmaWNhbmNlX2xldmVsLCBwYXN0ZSgiPCIsIHNpZ25pZmljYW5jZV9sZXZlbCksIHNwcmludGYoIiUuM2YiLCB4KSkNCiAgICB9DQogICkNCg0KaW52aXNpYmxlKHByaW50KHJlc3VsdF90YWJsZTEpKQ0KYGBgDQpgYGB7cn0NCnBlcmZvcm1fY2hpX3NxdWFyZTIgPC0gZnVuY3Rpb24oZGF0YSwgYWdlX2dyb3VwKSB7DQogIGZpbHRlcmVkX2RhdGEgPC0gZGF0YSAlPiUNCiAgICBmaWx0ZXIoYEFnZS5ncm91cGAgPT0gYWdlX2dyb3VwLCBTZXggIT0gIkJvdGggc2V4ZXMiKQ0KDQogIGNvbnRpbmdlbmN5X3RhYmxlIDwtIGZpbHRlcmVkX2RhdGEgJT4lDQogICAgc2VsZWN0KFNleCwgYFllcywgaGFkIGxvbmctdGVybSBzeW1wdG9tc2AsIGNvdW50KSAlPiUNCiAgICBtdXRhdGUoTm8gPSAoMTAwIC0gYFllcywgaGFkIGxvbmctdGVybSBzeW1wdG9tc2ApICogY291bnQgLyAxMDAsDQogICAgICAgICAgIFllcyA9IGBZZXMsIGhhZCBsb25nLXRlcm0gc3ltcHRvbXNgICogY291bnQgLyAxMDApICU+JQ0KICAgIHNlbGVjdCgtYFllcywgaGFkIGxvbmctdGVybSBzeW1wdG9tc2ApICU+JQ0KICAgIGdyb3VwX2J5KFNleCkgJT4lDQogICAgc3VtbWFyaXNlKE5vID0gc3VtKE5vKSwgWWVzID0gc3VtKFllcykpDQoNCiAgY2hpX3NxdWFyZV9yZXN1bHQgPC0gY2hpc3EudGVzdChjb250aW5nZW5jeV90YWJsZVstMV0pDQoNCiAgcmV0dXJuKGNoaV9zcXVhcmVfcmVzdWx0KQ0KfQ0KDQphZ2VfZ3JvdXBzIDwtIHVuaXF1ZShjb21iaW5lZF9kYXRhJGBBZ2UuZ3JvdXBgW2NvbWJpbmVkX2RhdGEkYEFnZS5ncm91cGAgIT0gIkFnZXMgMTggYW5kIG92ZXIiXSkNCg0KcmVzdWx0czIgPC0gbGlzdCgpDQpmb3IgKGFnZV9ncm91cCBpbiBhZ2VfZ3JvdXBzKSB7DQogIHJlc3VsdHMyW1thZ2VfZ3JvdXBdXSA8LSBwZXJmb3JtX2NoaV9zcXVhcmUyKGNvbWJpbmVkX2RhdGEsIGFnZV9ncm91cCkNCn0NCg0KdGVzdF9yZXN1bHRzMiA8LSBsYXBwbHkocmVzdWx0czIsIHRpZHkpICU+JSBiaW5kX3Jvd3MoKSAlPiUgbXV0YXRlKGBBZ2UuZ3JvdXBgID0gYWdlX2dyb3VwcykNCnRlc3RfcmVzdWx0czIgPC0gc2VsZWN0KHRlc3RfcmVzdWx0czIsIGBBZ2UuZ3JvdXBgLCBzdGF0aXN0aWMsIHAudmFsdWUpDQoNCnJlc3VsdF90YWJsZTIgPC0gdGVzdF9yZXN1bHRzMiAlPiUNCiAgZ3QoKSAlPiUNCiAgdGFiX2hlYWRlcigNCiAgICB0aXRsZSA9IG1kKCIqKlRhYmxlKCk6Q2hpLVNxdWFyZWQgVGVzdCBSZXN1bHRzIG9mIFNleCBhbmQgTG9uZyB0ZXJtIHN5bXB0b21zKioiKQ0KICApICU+JQ0KICBjb2xzX2xhYmVsKA0KICAgIGBBZ2UuZ3JvdXBgID0gIkFnZSBHcm91cCIsDQogICAgc3RhdGlzdGljID0gIkNoaS1TcXVhcmVkIFN0YXRpc3RpYyIsDQogICAgcC52YWx1ZSA9ICJQLVZhbHVlIg0KICApICU+JQ0KICBmbXRfbnVtYmVyKA0KICAgIGNvbHVtbnMgPSB2YXJzKHN0YXRpc3RpYyksDQogICAgZGVjaW1hbHMgPSAzDQogICkgJT4lDQogIGZtdCgNCiAgICBjb2x1bW5zID0gdmFycyhwLnZhbHVlKSwNCiAgICBmbnMgPSBmdW5jdGlvbih4KSB7DQogICAgICBpZmVsc2UoeCA8IDAuMDUsIHBhc3RlKCI8IDAuMDUiKSwgc3ByaW50ZigiJS4zZiIsIHgpKQ0KICAgIH0NCiAgKQ0KDQppbnZpc2libGUocHJpbnQocmVzdWx0X3RhYmxlMikpDQpgYGANCnByb3AgdGVzdD8gZmlzaGVyIHRlc3Q/IEctdGVzdD8NCg0KIyMgU2VjdGlvbiAzOiBQcmV2YWxlbmNlIE1vZGVsaW5nDQoNCiMgUmVzdWx0DQoNCiMjIFNlY3Rpb24gMTogTW9ydGFsaXR5DQoNCiMjIFNlY3Rpb24gMjogTG9uZy10ZXJtIEltcGFjdA0KDQojIyBTZWN0aW9uIDM6IFByZXZhbGVuY2UgTW9kZWxpbmcNCg0KYGBge3J9DQpXTW9ydGFsaXR5JT4lbXV0YXRlKFllYXI9eWVhcihSRUZfREFURSksIFdlZWs9c3Vic3RyKFJFRl9EQVRFLDYsMTApKSU+JW11dGF0ZShZZWFyPWZhY3RvcihZZWFyKSklPiVmaWx0ZXIoQWdlLmF0LnRpbWUub2YuZGVhdGg9PSJBZ2UgYXQgdGltZSBvZiBkZWF0aCwgYWxsIGFnZXMiICYgU2V4PT0iQm90aCBzZXhlcyIgJiBHRU89PSJDYW5hZGEsIHBsYWNlIG9mIG9jY3VycmVuY2UiKSU+JQ0KICBwbG90X2x5KHg9fldlZWssIHk9flZBTFVFLCBjb2xvcj1+WWVhcix0eXBlID0gInNjYXR0ZXIiLCBtb2RlPSJsaW5lcyIpDQpgYGANCg0KIyBEaXNjdXNzaW9uDQoNCiMjIFNlY3Rpb24gMTogTW9ydGFsaXR5DQoNCiMjIFNlY3Rpb24gMjogTG9uZy10ZXJtIEltcGFjdA0KDQojIyBTZWN0aW9uIDM6IFByZXZhbGVuY2UgTW9kZWxpbmcNCg0KIyBDb25jbHVzaW9uDQoNCiMgUmVmZXJlbmNlcw0K